package br.com.foxinline.manager.editar;

import br.com.foxinline.enums.Sexo;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerEditarCadastroIndividual implements Serializable {

    @EJB
    CadastroIndividualServico cadastroIndividualServico;
    @EJB
    CidadaoServico cidadaoServico;
    @EJB
    TipoDeficienciaServico tipoDeficienciaServico;
    @EJB
    ProfissionalServico profissionalServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    VacinaServico vacinaServico;
    @EJB
    CidadeServico cidadeServico;
    @EJB
    MicroAreaServico microAreaServico;
    @EJB
    QuestionarioAutoReferidoServico questionarioServico;
    private CadastroIndividual cadastroEditar;
    private CadastroIndividual cadastroVisualizar;
    private CadastroIndividual cadastroClone;
    private QuestionarioAutoReferido questionarioEditar;
    private QuestionarioAutoReferido questionarioVisualizar;
    private Cidadao cidadaoEditar;
    private Cidadao cidadaoVisualizar;
    private Cidadao responsavel;
    private Cidadao responsavelPesquisar;
    private List<Cidadao> responsaveis;
    private Cidade cidadeEditar;
    private Cidade cidadeVisualizar;
    private String condicaoSaude;
    private String pratica;
    private Vacina vacina;
    private Profissional profissionalCadastrar;
    private Profissional profissionalPesquisar;
    private List<Profissional> profissionaisPesquisar;
    private boolean mensagemEndereco;
    private String cadastroEditarId;
    private String cadastroVisualizarId;

    @PostConstruct
    public void init() {

        profissionaisPesquisar = new ArrayList<Profissional>();
        profissionalCadastrar = new Profissional();
        profissionalPesquisar = new Profissional();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();

        cadastroEditarId = params.get("cadastroEditarId");
        cadastroVisualizarId = params.get("cadastroVisualizarId");

        paramPost();
    }

    public Cidadao getResponsavelPesquisar() {
        return responsavelPesquisar;
    }

    public void setResponsavelPesquisar(Cidadao responsavelPesquisar) {
        this.responsavelPesquisar = responsavelPesquisar;
    }

    public List<Cidadao> getResponsaveis() {
        return responsaveis;
    }

    public void setResponsaveis(List<Cidadao> responsaveis) {
        this.responsaveis = responsaveis;
    }

    public Profissional getProfissionalCadastrar() {
        return profissionalCadastrar;
    }

    public void setProfissionalCadastrar(Profissional profissionalCadastrar) {
        this.profissionalCadastrar = profissionalCadastrar;
    }

    public Profissional getProfissionalPesquisar() {
        return profissionalPesquisar;
    }

    public void setProfissionalPesquisar(Profissional profissionalPesquisar) {
        this.profissionalPesquisar = profissionalPesquisar;
    }

    public List<Profissional> getProfissionaisPesquisar() {
        return profissionaisPesquisar;
    }

    public void setProfissionaisPesquisar(List<Profissional> profissionaisPesquisar) {
        this.profissionaisPesquisar = profissionaisPesquisar;
    }

    public CadastroIndividual getCadastroEditar() {
        return cadastroEditar;
    }

    public void setCadastroEditar(CadastroIndividual cadastroEditar) {
        this.cadastroEditar = cadastroEditar;
    }

    public CadastroIndividual getCadastroVisualizar() {
        return cadastroVisualizar;
    }

    public void setCadastroVisualizar(CadastroIndividual cadastroVisualizar) {
        this.cadastroVisualizar = cadastroVisualizar;
    }

    public QuestionarioAutoReferido getQuestionarioEditar() {
        return questionarioEditar;
    }

    public void setQuestionarioEditar(QuestionarioAutoReferido questionarioEditar) {
        this.questionarioEditar = questionarioEditar;
    }

    public QuestionarioAutoReferido getQuestionarioVisualizar() {
        return questionarioVisualizar;
    }

    public void setQuestionarioVisualizar(QuestionarioAutoReferido questionarioVisualizar) {
        this.questionarioVisualizar = questionarioVisualizar;
    }

    public Cidadao getCidadaoEditar() {
        return cidadaoEditar;
    }

    public void setCidadaoEditar(Cidadao cidadaoEditar) {
        this.cidadaoEditar = cidadaoEditar;
    }

    public Cidadao getCidadaoVisualizar() {
        return cidadaoVisualizar;
    }

    public void setCidadaoVisualizar(Cidadao cidadaoVisualizar) {
        this.cidadaoVisualizar = cidadaoVisualizar;
    }

    public Cidadao getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(Cidadao responsavel) {
        this.responsavel = responsavel;
    }

    public Cidade getCidadeEditar() {
        return cidadeEditar;
    }

    public void setCidadeEditar(Cidade cidadeEditar) {
        this.cidadeEditar = cidadeEditar;
    }

    public Cidade getCidadeVisualizar() {
        return cidadeVisualizar;
    }

    public void setCidadeVisualizar(Cidade cidadeVisualizar) {
        this.cidadeVisualizar = cidadeVisualizar;
    }

    public String getCondicaoSaude() {
        return condicaoSaude;
    }

    public void setCondicaoSaude(String condicaoSaude) {
        this.condicaoSaude = condicaoSaude;
    }

    public String getPratica() {
        return pratica;
    }

    public void setPratica(String pratica) {
        this.pratica = pratica;
    }

    public Vacina getVacina() {
        return vacina;
    }

    public void setVacina(Vacina vacina) {
        this.vacina = vacina;
    }

    public boolean isMensagemEndereco() {
        return mensagemEndereco;
    }

    public void setMensagemEndereco(boolean mensagemEndereco) {
        this.mensagemEndereco = mensagemEndereco;
    }

    /**
     *
     */
    public void atualizar() {
        try {
            if (verificarCadastro()) {
                cadastroEditar.setQuestionarioAutoReferido(questionarioEditar);

                if (cadastroEditar.equals(cadastroClone) && cadastroEditar.getQuestionarioAutoReferido().equals(cadastroClone.getQuestionarioAutoReferido())) {
                    cadastroIndividualServico.atualizar(cadastroEditar);
                } else {
                    if (!cadastroEditar.getQuestionarioAutoReferido().equals(cadastroClone.getQuestionarioAutoReferido())) {
                        cadastroClone.getQuestionarioAutoReferido().setId(null);

                        questionarioServico.salvar(cadastroClone.getQuestionarioAutoReferido());
                    }

                    cadastroClone.setAtual(false);
                    cadastroClone.setId(null);

                    cadastroEditar.setCadastroHistorico(cadastroClone);
                    cadastroEditar.setAtual(true);

                    cadastroIndividualServico.salvar(cadastroClone);
                    cadastroIndividualServico.atualizar(cadastroEditar);
                }

                Msg.messagemInfoRedirect(Msg.SuccessFull, "pesquisarcadastroindividual.xhtml");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeResponsavel() {
        cadastroEditar.setCartaoResponsavelFamiliar(cidadaoServico.existe(cadastroEditar.getCartaoResponsavelFamiliar()));
    }

    public List<TipoDeficiencia> autocompleteTipoDeficiencia(String query) {
        return tipoDeficienciaServico.autoComplete(query);
    }

    public List<Cidade> autocompleteCidade(String query) {
        return cidadeServico.autocomplete(query);
    }

    public List<Vacina> autocompleteVacina(String query) {
        return vacinaServico.autocomplete(query, questionarioEditar.getCriancaVacinasAtrasadas());
    }

    public List<MicroArea> autocompleteMicroArea(String query) {
        return microAreaServico.autocomplete(query);
    }

    public void pesquisarResponsavel() {
        responsaveis = cidadaoServico.pesquisarTodos(responsavelPesquisar);
    }

    public void removerResponsavel() {
        iniciarResponsavelFamiliar();
    }

    public void selecionarResponsavel(Cidadao cidadao) {
        cadastroEditar.setCartaoResponsavelFamiliar(cidadao);
        limparResponsavelDialog();
    }

    public void pesquisarProfissional() {
        profissionaisPesquisar = profissionalServico.findProfissional(profissionalPesquisar);
    }

    public void removerProfissional() {
        iniciarProfissional();
    }

    public void selecionarProfissional(Profissional profissional) {
        cadastroEditar.setProfissional(profissional);
        limparProfissionalDialog();
    }

    public void salvarProfissional() {
        try {
            profissionalServico.salvar(profissionalCadastrar);
            Msg.messagemInfo(Msg.SuccessFull);
            cadastroEditar.setProfissional(profissionalCadastrar);

            RequestContext.getCurrentInstance().execute("dialogProfissional.hide()");

        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void editarPratica(String a) {
        questionarioEditar.getOutrasPraticasIntegrativasNome().remove(a);
        pratica = a;
    }

    public void removerPratica(String a) {
        questionarioEditar.getOutrasPraticasIntegrativasNome().remove(a);
    }

    public void adicionarPratica() {
        questionarioEditar.getOutrasPraticasIntegrativasNome().add(pratica);
        pratica = "";
    }

    public void editarCondicao(String condicao) {
        questionarioEditar.getOutrasCondicoesSaude().remove(condicao);
        condicaoSaude = condicao;
    }

    public void removerCondicao(String condicao) {
        questionarioEditar.getOutrasCondicoesSaude().remove(condicao);
    }

    public void adicionarCondicao() {
        questionarioEditar.getOutrasCondicoesSaude().add(condicaoSaude);
        condicaoSaude = "";
    }

    public void adicionarVacina() {
        if (vacina.getId() != null) {
            questionarioEditar.getCriancaVacinasAtrasadas().add(vacina);
            vacina = new Vacina();
        }
    }

    public void removerVacina(Vacina vacina) {
        questionarioEditar.getCriancaVacinasAtrasadas().remove(vacina);
    }

    public String peso(double peso) {

        int integer = (int) peso;
        double decimal = (10 * peso - 10 * integer) / 10;

        return integer + " quilo(s) e " + String.format("%3.0f", decimal * 1000) + " gramas";
    }

    public String altura(double altura) {

        int integer = (int) altura;
        double decimal = (10 * altura - 10 * integer) / 10;

        return integer + " m e " + String.format("%3.0f", decimal * 1000) + " cm";
    }

    public void existeEndereco() {

        Endereco endereco = enderecoServico.existCep(profissionalCadastrar.getEndereco());

        if (endereco != null) {
            profissionalCadastrar.setEndereco(endereco);
            mensagemEndereco = false;
        } else {
            String cep = profissionalCadastrar.getEndereco().getCep();
            profissionalCadastrar.setEndereco(new Endereco());
            profissionalCadastrar.getEndereco().setCep(cep);

            mensagemEndereco = true;
        }
    }

    private boolean verificarCadastro() {
        if (cadastroEditar.getProfissional().getId() == null) {
            Msg.messagemError("Profissional é obrigatório");
            RequestContext.getCurrentInstance().execute("requiredProfissional(true)");
            return false;
        }

        if (cidadaoEditar != null && cidadaoEditar.getSexo() != null && cidadaoEditar.getSexo().equals(Sexo.MASCULINO)) {
            questionarioEditar.setGestante(null);
            questionarioEditar.setPuerperio(null);
            questionarioEditar.setPccu(null);
        }

        if (cadastroEditar.getResponsavelFamiliar() != null && cadastroEditar.getResponsavelFamiliar() == false) {
            cadastroEditar.setCartaoResponsavelFamiliar(null);
        }

        if (cadastroEditar.getMembroComunidade() != null && cadastroEditar.getMembroComunidade() == false) {
            cadastroEditar.setNomeComunidade(null);
        }

        if (cadastroEditar.getInformarOrientacaoSexual() != null && cadastroEditar.getInformarOrientacaoSexual() == false) {
            cadastroEditar.setOrientacaoSexual(null);
        }

        if (cadastroEditar.getPossuiDeficiencia() != null && cadastroEditar.getPossuiDeficiencia() == false) {
            cadastroEditar.setTipoDeficiencia(null);
        }

        if (cadastroEditar.getSituacaoDeRua() != null && cadastroEditar.getSituacaoDeRua() == false) {
            cadastroEditar.setTempoSituacaoRua(null);
        }

        if (cadastroEditar.getAcompanhadoOutraInstituicao() != null && cadastroEditar.getAcompanhadoOutraInstituicao() == false) {
            cadastroEditar.setNomeOutraInstituicao(null);
        }

        if (cadastroEditar.getFrequentaFamiliarFrequencia() != null && cadastroEditar.getFrequentaFamiliarFrequencia() == false) {
            cadastroEditar.setGrauParentesco(null);
        }

        if (cadastroEditar.getFrequentaEscola() != null && cadastroEditar.getFrequentaEscola() == false) {
            cadastroEditar.setTipoCurso(null);
        }

        if (cadastroEditar.getResponsavelFamiliar() != null && cadastroEditar.getResponsavelFamiliar() == true) {
            cadastroEditar.setCartaoResponsavelFamiliar(null);
        }

        if (questionarioEditar.getGestante() != null && questionarioEditar.getGestante() == false) {
            questionarioEditar.setGestanteDUM(null);
            questionarioEditar.setGestanteDPP(null);
            questionarioEditar.setGestanteExamesEmDia(null);
            questionarioEditar.setGestanteQualTrimestre(null);
            questionarioEditar.setGestanteAcompanhamentoPreNatal(null);
            questionarioEditar.setGestanteGravidezMenorVinteAnos(null);
        }

        if (questionarioEditar.getPuerperio() != null && questionarioEditar.getPuerperio() == false) {
            questionarioEditar.setPuerperioExclusivo(null);
            questionarioEditar.setPuerperioMisto(null);
            questionarioEditar.setPuerperioRNPeso(null);
        }

        if (questionarioEditar.getPccu() != null && questionarioEditar.getPccu() == false) {
            questionarioEditar.setPccuFazAnualmente(null);
            questionarioEditar.setPccuQuantoTempo(null);
        }

        if (questionarioEditar.getFumante() != null && questionarioEditar.getFumante() == false) {
            questionarioEditar.setFumanteQuantoTempo(null);
        }

        if (questionarioEditar.getDependenteAlcoolico() != null && questionarioEditar.getDependenteAlcoolico() == false) {
            questionarioEditar.setDependenteAlcoolicoQuantoTempo(null);
        }

        if (questionarioEditar.getHipertensao() != null && questionarioEditar.getHipertensao() == false) {
            questionarioEditar.setHipertensaoUsaMedicamento(null);
            questionarioEditar.setHipertensaoNomeMedicamento(null);
        }

        if (questionarioEditar.getDiabetes() != null && questionarioEditar.getDiabetes() == false) {
            questionarioEditar.setDiabetesUsaMedicamento(null);
            questionarioEditar.setDiabetesHospitalizacaoPorComplicacao(null);
            questionarioEditar.setDiabetesNomeMedicamento(null);
        }

        if (questionarioEditar.getPossuiDoencaCardiaca() != null && questionarioEditar.getPossuiDoencaCardiaca() == false) {
            questionarioEditar.setDoencaCardiaca(null);
        }

        if (questionarioEditar.getPossuiProblemaRenal() != null && questionarioEditar.getPossuiProblemaRenal() == false) {
            questionarioEditar.setProblemaRenal(null);
            questionarioEditar.setProblemaRenalNomeMedicacao(null);
            questionarioEditar.setProblemaRenalQuantoTempo(null);
        }

        if (questionarioEditar.getPossuiDoencaPulmonar() != null && questionarioEditar.getPossuiDoencaPulmonar() == false) {
            questionarioEditar.setDoencaPulmonar(null);
            questionarioEditar.setDoencaPulmonarNomeMedicacao(null);
            questionarioEditar.setDoencaPulmonarQuantoTempo(null);
        }

        if (questionarioEditar.getHanseniase() != null && questionarioEditar.getHanseniase() == false) {
            questionarioEditar.setHanseniaseCurado(null);
            questionarioEditar.setHanseniaseEmTratamento(null);
        }

        if (questionarioEditar.getTuberculose() != null && questionarioEditar.getTuberculose() == false) {
            questionarioEditar.setTuberculoseCurado(null);
            questionarioEditar.setTuberculoseEmTratamento(null);
        }

        if (questionarioEditar.getCancer() != null && questionarioEditar.getCancer() == false) {
            questionarioEditar.setCancerCurado(null);
            questionarioEditar.setCancerEmTratamento(null);
            questionarioEditar.setCancerNome(null);
            questionarioEditar.setCancerNomeMedicamento(null);
            questionarioEditar.setCancerQuantoTempo(null);
        } else {
            if (questionarioEditar.getCancerEmTratamento() != null && questionarioEditar.getCancerEmTratamento() == false) {
                questionarioEditar.setCancerNomeMedicamento(null);
            } else {
                questionarioEditar.setCancerCurado(false);
            }
        }

        if (questionarioEditar.getDstsAids() != null && questionarioEditar.getDstsAids() == false) {
            questionarioEditar.setDstsAidsCurado(null);
            questionarioEditar.setDstsAidsEmTratamento(null);
            questionarioEditar.setDstsAidsNome(null);
            questionarioEditar.setDstsAidsNomeMedicamento(null);
        } else {
            if (questionarioEditar.getDstsAidsEmTratamento() != null && questionarioEditar.getDstsAidsEmTratamento() == false) {
                questionarioEditar.setDstsAidsNomeMedicamento(null);
            } else {
                questionarioEditar.setDstsAidsCurado(false);
            }
        }

        if (questionarioEditar.getInternadoRecentemente() != null && questionarioEditar.getInternadoRecentemente() == false) {
            questionarioEditar.setCausaInternacaoRecente(null);
        }

        if (questionarioEditar.getAcamado() != null && questionarioEditar.getAcamado() == false) {
            questionarioEditar.setAcamadoMotivo(null);
            questionarioEditar.setAcamadoQuantoTempo(null);
        }

        if (questionarioEditar.getUsaPlantasMedicinais() != null && questionarioEditar.getUsaPlantasMedicinais() == false) {
            questionarioEditar.setNomePlantasMedicinais(null);
        }

        if (questionarioEditar.getOutrasPraticasIntegrativas() != null && questionarioEditar.getOutrasPraticasIntegrativas() == false) {
            questionarioEditar.setOutrasPraticasIntegrativasNome(null);
        }

        if (questionarioEditar.getOutrasCondicoesSaude() != null && questionarioEditar.getOutrasCondicoesSaude().isEmpty()) {
            questionarioEditar.setOutrasCondicoesSaude(null);
        }

        if (questionarioEditar.getAcessoHigienePessoal() != null && questionarioEditar.getAcessoHigienePessoal() == false) {
            questionarioEditar.setHigienePessoal(null);
        }

        if (questionarioEditar.getCriancaVacinada() != null && questionarioEditar.getCriancaVacinada()) {
            questionarioEditar.setCriancaVacinasAtrasadas(null);
        }

        return true;
    }

    private void iniciarProfissional() {
        cadastroEditar.setProfissional(new Profissional());
        cadastroEditar.getProfissional().setMicroArea(new MicroArea());
    }

    private void iniciarResponsavelFamiliar() {
        cadastroEditar.setCartaoResponsavelFamiliar(new Cidadao());
        cadastroEditar.getCartaoResponsavelFamiliar().setMunicipioNascimento(new Cidade());
    }

    public void paramPost() {
        try {
            if (cadastroEditarId != null) {
                cadastroEditar = cadastroIndividualServico.pesquisar(Long.parseLong(cadastroEditarId));
                cadastroClone = cadastroEditar.getClone();
                cadastroClone.setQuestionarioAutoReferido(cadastroEditar.getQuestionarioAutoReferido().getClone());

                if (cadastroEditar.getCidadao() == null) {
                    cadastroEditar.setCidadao(new Cidadao());
                } else {

                    if (cadastroEditar.getCidadao().getMunicipioNascimento() == null) {
                        cadastroEditar.getCidadao().setMunicipioNascimento(new Cidade());
                    }
                }

                if (cadastroEditar.getProfissional() == null) {
                    cadastroEditar.setProfissional(new Profissional());
                }

                if (cadastroEditar.getCartaoResponsavelFamiliar() == null) {
                    cadastroEditar.setCartaoResponsavelFamiliar(new Cidadao());
                }

                if (cadastroEditar.getCartaoResponsavelFamiliar() != null) {
                    cadastroEditar.setCartaoResponsavelFamiliar(new Cidadao());
                }

                if (cadastroEditar.getQuestionarioAutoReferido() == null) {
                    questionarioEditar = new QuestionarioAutoReferido();
                } else {
                    questionarioEditar = cadastroEditar.getQuestionarioAutoReferido();
                }

                if (questionarioEditar.getOutrasPraticasIntegrativasNome() == null) {
                    questionarioEditar.setOutrasPraticasIntegrativasNome(new ArrayList<String>());
                }

                if (questionarioEditar.getOutrasCondicoesSaude() == null) {
                    questionarioEditar.setOutrasCondicoesSaude(new ArrayList<String>());
                }

                if (questionarioEditar.getDoencaCardiaca() == null) {
                    questionarioEditar.setDoencaCardiaca(new ArrayList<DoencaCardiaca>());
                }

                if (questionarioEditar.getProblemaRenal() == null) {
                    questionarioEditar.setProblemaRenal(new ArrayList<ProblemaRenal>());
                }

                if (questionarioEditar.getDoencaPulmonar() == null) {
                    questionarioEditar.setDoencaPulmonar(new ArrayList<DoencaPulmonar>());
                }
            }

            if (cadastroVisualizarId != null) {
                cadastroVisualizar = cadastroIndividualServico.pesquisar(Long.parseLong(cadastroVisualizarId));

                if (cadastroVisualizar.getCidadao() == null) {
                    cadastroVisualizar.setCidadao(new Cidadao());
                }

                if (cadastroVisualizar.getProfissional() == null) {
                    cadastroVisualizar.setProfissional(new Profissional());
                }

                if (cadastroVisualizar.getCartaoResponsavelFamiliar() == null) {
                    cadastroVisualizar.setCartaoResponsavelFamiliar(new Cidadao());
                }

                if (cadastroVisualizar.getQuestionarioAutoReferido() == null) {
                    cadastroVisualizar.setQuestionarioAutoReferido(new QuestionarioAutoReferido());

                    if (cadastroVisualizar.getQuestionarioAutoReferido().getOutrasPraticasIntegrativasNome() == null) {
                        cadastroVisualizar.getQuestionarioAutoReferido().setOutrasPraticasIntegrativasNome(new ArrayList<String>());
                    }

                    if (cadastroVisualizar.getQuestionarioAutoReferido().getOutrasCondicoesSaude() == null) {
                        cadastroVisualizar.getQuestionarioAutoReferido().setOutrasCondicoesSaude(new ArrayList<String>());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void limparResponsavelDialog() {
        responsavelPesquisar = new Cidadao();
        responsaveis = new ArrayList<Cidadao>();
    }

    public void limparProfissionalDialog() {
        profissionalPesquisar = new Profissional();
        profissionalCadastrar = new Profissional();
        profissionaisPesquisar = new ArrayList<Profissional>();
    }
}
